import path, { resolve } from 'path'
import { defineConfig, optimizeDeps } from 'vite'
import vue from '@vitejs/plugin-vue'
import vueJsx from '@vitejs/plugin-vue-jsx'
import vueDevTools from 'vite-plugin-vue-devtools'
import AutoImport from 'unplugin-auto-import/vite'
import Components from 'unplugin-vue-components/vite'
import { AntDesignVueResolver } from 'unplugin-vue-components/resolvers'
import { compression } from 'vite-plugin-compression2'
import { fileURLToPath } from 'node:url'

// https://vitejs.dev/config/
export default defineConfig({
  base: './',
  plugins: [
    vue(),
    vueJsx(),
    vueDevTools(),
    AutoImport({
      imports: [
        'vue',
        'vue-router',
        'pinia',
        'vue-i18n',
        {
          'ant-design-vue': []
        },
        { axios: [['default', 'axios']] },
        {
          '@vueuse/core': [
            'useMouse',
            'useStorage',
            'useWindowSize',
            'useTitle',
            'useFavicon',
            'useDebounce',
            'useThrottle'
          ]
        }
      ],
      dts: './auto-imports.d.ts',
      eslintrc: {
        enabled: false, // Default `false`
        filepath: './.eslintrc-auto-import.json', // Default `./.eslintrc-auto-import.json`
        globalsPropValue: true // Default `true`, (true | false | 'readonly' | 'readable' | 'writable' | 'writeable')
      }
    }),
    Components({
      dirs: ['src/components'], // 配置需要默认导入的自定义组件文件夹，该文件夹下的所有组件都会自动 import
      resolvers: [AntDesignVueResolver({ importStyle: false, resolveIcons: true })]
    }),
    compression({
      threshold: 500, // 设置只有超过 2k 的文件才执行压缩
      deleteOriginalAssets: false, // 设置是否删除原文件
      skipIfLargerOrEqual: true // 如果压缩后的文件大小与原文件大小一致或者更大时，不进行压缩
      // 其他的属性暂不需要配置，使用默认即可
    })
  ],
  resolve: {
    alias: {
      '@': fileURLToPath(new URL('./src', import.meta.url))
    }
  },
  server: {
    host: true,
    port: 1699,
    proxy: {
      '*': {
        changeOrigin: true
      }
    }
  },
  build: {
    minify: 'terser', //  启用/禁用压缩。可以选择 esbuild 或 terser，也可以设置为 false。
    outDir: 'vue-dist', // 打包后目录名称
    sourcemap: true, // 定位源文件
    terserOptions: {
      compress: {
        drop_console: true, // 压缩时打包移除console
        drop_debugger: true // 压缩时打包移除console
      }
    },
    rollupOptions: {
      output: {
        manualChunks: (id) => {
          if (id.includes('node_modules')) {
            return 'vendor'
          }
        },
        // 入口 js 文件
        entryFileNames: 'js/[name]-[hash].js',

        // 影响分包结果
        chunkFileNames: 'js/[name]-[hash].js',

        // 除了 js 的其他文件
        assetFileNames(assetInfo) {
          if (assetInfo?.name?.endsWith('.css')) {
            return 'css/[name]-[hash].css'
          }
          const imgExts = ['.png', '.jpg', '.jpeg', '.webp', '.svg', '.gif', '.icon']
          if (imgExts.some((ext) => assetInfo?.name?.endsWith(ext))) {
            return 'imgs/[name]-[hash][ext]'
          }
          return 'assets/[name]-[hash].[ext]'
        }
      }
    }
  }
})
